
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>SpringBoot3 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>SpringBoot3 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">SpringBoot的核心设计思想是什么？它如何帮助提升开发效率？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">SpringBoot的核心设计思想是“约定优于配置”。这意味着框架通过一系列约定来减少开发者需要进行的配置工作。例如，框架提供了大量默认配置，开发者可以直接使用，如果默认值不满足需求，也可以通过配置文件重写，从而大大提升了开发效率。</div>
          </div>
          <div class="card-source">来源: 二、SpringBoot介绍 和 2.1 约定优于配置</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">当我们向SpringBoot项目中添加`spring-boot-starter-web`依赖时，根据“约定”，会自动集成哪些核心组件？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当我们导入`spring-boot-starter-web`后，SpringBoot会约定这是一个Web开发环境，并自动帮我们导入SpringMVC的相关依赖、一个内置的Tomcat容器，以及`spring-boot-starter-logging`日志依赖。这使得Web项目可以直接通过main方法或JAR包独立运行。</div>
          </div>
          <div class="card-source">来源: 2.2 SpringBoot中的约定</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">配置</div>
          <div class="card-question">在SpringBoot中如何实现多环境配置，并在部署时指定运行环境？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">配置</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">首先，在主配置文件`application.yml`中通过`spring.profiles.active`属性指定默认激活的环境名。然后，在`resources`目录下创建多个`application-环境名.yml`文件。最后，在部署时可以通过命令行参数`--spring.profiles.active=环境`来覆盖默认配置，从而激活指定的环境。</div>
          </div>
          <div class="card-source">来源: 5.2 多环境配置</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">SpringBoot默认的静态资源映射路径有哪些？它们的优先级顺序是怎样的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">SpringBoot默认的静态资源映射路径有四个：`classpath:/META-INF/resources`、`classpath:/resources`、`classpath:/static`、`classpath:/public`。它们的优先级顺序为：`META-INF/resources` > `resources` > `static` > `public`。</div>
          </div>
          <div class="card-source">来源: 八、SpringBoot静态资源处理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在SpringBoot中整合MyBatis时，XML方式和注解方式分别适用于什么场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">根据文档建议，XML方式在编写复杂SQL时更适合；而注解方式因其配置简单，推荐在编写简单SQL时使用。</div>
          </div>
          <div class="card-source">来源: 六、SpringBoot整合Mybatis</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">请描述在SpringBoot中如何实现一个统一的API响应格式，并说明其主要构成部分。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">实现统一响应格式通常需要三个部分：1. 定义一个结果接口（如IResult）来规范返回结构。2. 定义一个枚举（如ResultEnum）来存储常用的返回状态码和消息。3. 定义一个泛型结果类（如Result<T>），包含状态码、消息和数据，并提供静态工厂方法来方便地创建成功或失败的响应实例。在Controller中统一使用这个结果类作为返回类型。</div>
          </div>
          <div class="card-source">来源: 十五 、控制层统一返回格式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">什么是SpringBoot的条件注解？它的主要作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">SpringBoot的条件注解是一种在应用程序启动时，根据特定条件来动态决定是否加载某个Bean或配置的机制。它的主要作用是允许开发人员根据环境、配置或其他因素来控制Bean的创建或配置类的加载，从而实现灵活的自动配置。例如，`@ConditionalOnClass`注解可以使配置仅在类路径中存在某个特定类时才生效。</div>
          </div>
          <div class="card-source">来源: 十七、SpringBoot条件注解</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">什么是GraalVM的原生镜像（Native Image）功能？它能为Java应用带来哪些核心优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">GraalVM的原生镜像功能允许开发者将Java应用程序编译成一个独立的可执行文件。其核心优势在于能够显著提高应用程序的启动速度和降低内存占用。</div>
          </div>
          <div class="card-source">来源: 十九、GraalVM原生镜像</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在SpringBoot的函数式Web编程模型中，RouterFunction、RequestPredicate、ServerRequest和ServerResponse这四个核心类分别扮演什么角色？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. **RouterFunction**：负责将HTTP请求映射到处理器函数，类似于传统MVC中的控制器。<br>2. **RequestPredicate**：用于定义路由条件，根据请求的路径、方法、头信息等来判断请求是否匹配特定路由。<br>3. **ServerRequest**：是对HTTP请求的抽象，提供了访问请求头、参数、请求体等信息的方法。<br>4. **ServerResponse**：是对HTTP响应的抽象，允许构建响应的状态码、头信息和响应体。</div>
          </div>
          <div class="card-source">来源: 十八、函数式Web编程</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">配置</div>
          <div class="card-question">在SpringBoot中，如何使用Java配置类来替代传统的XML配置？请描述相关的核心注解。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">配置</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以使用`@Configuration`注解来标记一个类为配置类，这相当于XML文件中的`<beans>`标签。在配置类内部，可以使用`@Bean`注解在一个方法上，该方法返回的对象将被注册为Spring容器中的一个Bean，这相当于XML中的`<bean>`标签。方法名通常作为Bean的ID。</div>
          </div>
          <div class="card-source">来源: 4.1 @Configuration和@Bean</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当SpringBoot应用发生异常时，默认会如何响应给浏览器和非浏览器客户端？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">默认情况下，响应方式有两种：1. 对于浏览器客户端（请求头Accept包含text/html），SpringBoot会响应一个名为“Whitelabel Error Page”的HTML错误页面。2. 对于非浏览器客户端（如Postman），SpringBoot会返回一个包含错误信息的JSON格式字符串。</div>
          </div>
          <div class="card-source">来源: 十二、SpringBoot全局异常处理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">RestTemplate是什么？它在Spring应用中起什么作用？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">RestTemplate是Spring框架提供的一个类，用于在应用程序中调用REST服务。它简化了与HTTP服务的通信方式，封装了HTTP连接，开发者只需传入URL和返回值类型即可，是一种比HttpClient更优雅的调用RESTful服务的方式。</div>
          </div>
          <div class="card-source">来源: 十四、RestTemplate</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
